#include "widget.h"
#include "ui_widget.h"

#include "mythread.h" // 引用子线程
#include <QDebug>
#include <QThread>
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    // 创建子线程对象
    QThread* t1 = new QThread;
    QThread* t2 = new QThread;
    QThread* t3 = new QThread;
    // 创建任务类的对象
    Generate *gen = new Generate;
    BubbleSort*  bubble = new BubbleSort;
    QuickSort* quick = new QuickSort;
    // 将任务对象移动到某个子线程中
    gen->moveToThread(t1);
    bubble->moveToThread(t2);
    quick->moveToThread(t3);

    // 2 启动子线程

    connect(ui->startBtn,&QPushButton::clicked,this,[=](){
        emit this->starting(1000); // 这个信号是给 子线程传递一个 1000 的值用于 子线程循环的条件
        // 当按钮被按下 同时启动子线程
        t1->start();
    });

    // 当启动子线程之后会发出一个信号starting 这个信号会被这个connect接收
    // 然后 Generate 中的 recvNum 函数响应 并接收到 1000 这个值
    connect(this,&Widget::starting,gen,&Generate::working);

    // 将待排序的数据通过信号传递给两个排序算法,进行排序
    connect(gen,&Generate::sendArray,bubble,&BubbleSort::working);
    connect(gen,&Generate::sendArray,quick,&QuickSort::working);
    // 此时子线程开始启动开始实现逻辑返回一个vector<int>类型的数据，并且结束的时候会发出一个信号(函数实现里面写了这个信号)
    // 然后主线程接收这个vector<int> ，并且对这个数据进行处理
    connect(gen,&Generate::sendArray,this,[=](QVector<int> list){
        // 在主线程中启动两个排序算法的主线程
        t2->start();
        t3->start();
        for (int i = 0; i < list.size(); i++)
        {
            // 将 i 转换成 qstring
//            qDebug() << list[5]; // 输出3166
            ui->randList->addItem(QString::number(list[i]));
        }
    });
    // 此时写到这里运行的话会不会报错 ，但是实现不了
    // 因为信号传递的时候不支持 QVector<int> 类型的数据传递
    // 要去 main 函数里面将这个 数据类型注册一下 用这个qRegisterMetaType(QVector<int>)

    // 在主线程中接收两个排序算法的子线程发送过来的排序好的数据
    // 并将数据显示到窗口中
    // 冒泡排序
    connect(bubble,&BubbleSort::finish,this,[=](QVector<int> list){
        for (int i = 0; i < list.size(); i++)
        {
            // 将 i 转换成 qstring
            ui->bubbleList->addItem(QString::number(list[i]));
        }
    });
    // 快速排序
    connect(quick,&QuickSort::finish,this,[=](QVector<int> list){
        for (int i = 0; i < list.size(); i++)
        {
            // 将 i 转换成 qstring
            ui->quickList->addItem(QString::number(list[i]));
        }
    });
    // 进程 结束 回收释放资源
    connect(this,&QWidget::destroyed,this,[=](){
        t1->quit();
        t1->wait(); // 确保线程真的退出了
        t1->deleteLater(); // 等价与 delete 他t1

        t2->quit();
        t2->wait();
        t2->deleteLater();

        t3->quit();
        t3->wait();
        t3->deleteLater();

        gen->deleteLater();
        bubble->deleteLater();
        quick->deleteLater();
    });
}

Widget::~Widget()
{
    delete ui;
}
